package org.example.controller;

import org.example.exception.AppException;
import org.example.model.User;
import org.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 注册功能
     * 1、头像保存
     * 2、用户信息
     * 3、抽奖活动的信息，setting 表，保存能抽奖几个人这种
     * @param user          用户注册信息
     * @param headFile      用户头像文件
     * @return
     */
    @RequestMapping("/register")
    public Object register(User user, MultipartFile headFile){
        //校验请求数据：后端必须要有，我们省略

        //保存上传的用户头像到服务端本地
        if(headFile != null) {
            String head = userService.saveHead(headFile);
            //上传的路径映射为http服务路径
            //用户头像的http路径设置到user.head，把user插入数据库
            user.setHead(head);
        }
        // 进行真正的注册功能
        // 人员信息和抽奖活动信息
        userService.register(user);

        return null;
    }

    /**
     * 登录接口
     * 查询用户是否存在，存在且密码正确，将用户信息存入session，登录成功
     * @param user      前端上传的用户信息
     * @param req       servlet请求信息
     * @return          返回相应的信息
     */
    @PostMapping("/login")
    public Object login(@RequestBody User user, HttpServletRequest req){//username, password
        //根据账号查用户
        User exist = userService.queryByUsername(user.getUsername());
        //用户不存在
        if(exist == null) throw new AppException("LOG001", "用户不存在");
        //用户存在，校验密码
        if(!user.getPassword().equals(exist.getPassword()))
            throw new AppException("LOG002", "账号或密码错误");
        //校验通过，保存数据库的用户(包含所有字段)到session，没有就创建一个session
        HttpSession session = req.getSession(true);
        // 将user信息放到session中
        session.setAttribute("user", exist);
        return null;//登录成功
    }

    /**
     * 登出功能
     * 直接移除user的session信息
     * @param session
     * @return
     */
    @GetMapping("/logout")
    public Object logout(HttpSession session){
        // 移除掉用户相关的session属性
        session.removeAttribute("user");
        return null;
    }
}
